home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / nrpas13.zip / IRBIT2.PAS < prev    next >
Pascal/Delphi Source File  |  1991-04-29  |  2KB  |  70 lines

  1. FUNCTION irbit2(VAR iseed: integer): integer;
  2. (* This routine runs much faster if you can perform bitwise logical operations
  3. on integers.  For example, here is a TURBO Pascal version:
  4. CONST
  5.    ib1=1; ib3=4; ib5=16; ib14=8192; mask = 21;
  6. BEGIN
  7.    IF (iseed AND ib14) <> 0 THEN BEGIN
  8.       iseed := ((iseed XOR mask) SHL 1) OR ib1;
  9.       irbit2 := 1
  10.    END ELSE BEGIN
  11.       iseed := (iseed SHL 1) AND (NOT ib1);
  12.       irbit2 := 0
  13.    END
  14. END; *)
  15. (* Here is the slower version for other Pascal systems: *)
  16. CONST
  17.    ib1=1;
  18.    ib3=4;
  19.    ib5=16;
  20.    ib14=8192;   (* Values chosen not to overflow 2-byte integers *)
  21.    mask = 21;   (* ib1+ib3+ib5 *)
  22. VAR
  23.    mask1: integer;
  24. FUNCTION iand(i1,i2: integer): integer;
  25.    VAR
  26.       i: integer;
  27.    BEGIN
  28.       IF ((i1=0) OR (i2=0)) THEN iand := 0
  29.       ELSE BEGIN
  30.          i := ord(odd(i1) AND odd(i2));
  31.          i1 := i1 DIV 2; i2 := i2 DIV 2;
  32.          iand := 2*iand(i1,i2) + i
  33.       END
  34.    END;
  35. FUNCTION inot(i: integer): integer;
  36.    BEGIN inot := maxint-i END;
  37. FUNCTION ior(i1,i2: integer): integer;
  38.    VAR
  39.       i: integer;
  40.    BEGIN
  41.       IF ((i1=0) AND (i2=0)) THEN ior := 0
  42.       ELSE BEGIN
  43.          i := ord(odd(i1) OR odd(i2));
  44.          i1 := i1 DIV 2; i2 := i2 DIV 2;
  45.          ior := 2*ior(i1,i2) + i
  46.       END
  47.    END;
  48. FUNCTION ieor(i1,i2: integer): integer;
  49.    VAR
  50.       i: integer;
  51.    BEGIN
  52.       IF ((i1=0) AND (i2=0)) THEN ieor := 0
  53.       ELSE BEGIN
  54.          i := ord((odd(i1) AND NOT odd(i2))
  55.                OR (odd(i2) AND NOT odd(i1)));
  56.          i1 := i1 DIV 2; i2 := i2 DIV 2;
  57.          ieor := 2*ieor(i1,i2) + i
  58.       END
  59.    END;
  60. BEGIN
  61.    mask1 := maxint DIV 2;
  62.    IF (iand(iseed,ib14) <> 0) THEN BEGIN
  63.       iseed := ior(2*iand(ieor(iseed,mask),mask1),ib1);
  64.       irbit2 := 1
  65.    END ELSE BEGIN
  66.       iseed := iand(2*iand(iseed,mask1),inot(ib1));
  67.       irbit2 := 0
  68.    END
  69. END;
  70.